#ifndef _GPIO_H_
#define _GPIO_H_

#define GPIO_BASE		0xB94C0000

#define GPIO_TIMER_PRESCALER	(GPIO_BASE + 0x00)
#define GPIO_TIMER_CFG          (GPIO_BASE + 0x04)
#define GPIO_TIMER_TCON         (GPIO_BASE + 0x10)
#define GPIO_TIMER1_TLE0B1      (GPIO_BASE + 0x1c)
#define GPIO_TIMER1_TLE1B1      (GPIO_BASE + 0x1e)
#define GPIO_TIMER1_TLE2B1      (GPIO_BASE + 0x20)
#define GPIO_TIMER1_TLE3B1      (GPIO_BASE + 0x22)	/* Repeat Number */

#define GPIO_ENB        (GPIO_BASE + 0x54)
#define GPIO_DO         (GPIO_BASE + 0x56)  /* Data Ouput */
#define GPIO_OE         (GPIO_BASE + 0x58)  /* 1:Output/0:Input Selection */
#define GPIO_DI         (GPIO_BASE + 0x5c)  /* Data input */
#define GPIO_KEY_ENB    (GPIO_BASE + 0x78)  /* Keypad enable */
#define GPIO_KEY_POL    (GPIO_BASE + 0x7a)  /* Keypad input polarity select 0: rasing edge 1: falling edge */
#define GPIO_KEY_PERIOD (GPIO_BASE + 0x7c)  /* Keypand Number from 0 to 255 for Debounce */
#define GPIO_RSTN       (GPIO_BASE + 0x7e)
#define GPIO_KEY_MASK   (GPIO_BASE + 0x80)
#define GPIO_KEY_STATUS (GPIO_BASE + 0x82)
#define GPIO_PF0_PU     (GPIO_BASE + 0x64)
#define GPIO_PF0_PD     (GPIO_BASE + 0x66)
#define GPIO_PF1_SMT    (GPIO_BASE + 0x68)

// macros
#define SET_GPIO_ENABLE(bits)	(writew(readw(GPIO_ENB) | (bits), GPIO_ENB))
#define SET_GPIO_DISABLE(bits)	(writew(readw(GPIO_ENB) & ~(bits), GPIO_ENB))
#define SET_GPIO_INPUT(bits)	(writew(readw(GPIO_OE) & ~(bits), GPIO_OE))
#define SET_GPIO_OUTPUT(bits)	(writew(readw(GPIO_OE) | (bits), GPIO_OE))
#define SET_GPIO_PULLDOWN(bits) (writew(readw(GPIO_PF0_PD) | (bits), GPIO_PF0_PD))
#define SET_GPIO_PULLUP(bits)	(writew(readw(GPIO_PF0_PU) | (bits), GPIO_PF0_PU))
#define READ_GPIO(bit)			(readw(GPIO_DI) & (bit))
#define WRITE_0_GPIO(bit)		(writew(readw(GPIO_DI) & ~(bit), GPIO_DO))
#define WRITE_1_GPIO(bit)		(writew(readw(GPIO_DI) | (bit), GPIO_DO))



#endif
